home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / dskut / handle20.zip / FILES33.ASM < prev    next >
Assembly Source File  |  1987-07-17  |  17KB  |  336 lines

  1. ;****************************************************************************
  2. ; file: files33.asm    by: Steven M. Gibson, Irvine, CA        created: 06/06/87
  3. ;****************************************************************************
  4. ;
  5. ;          * * * PUBLIC DOMAIN COPYRIGHT RELEASE NOTICE * * *
  6. ;
  7. ; THIS PROGRAM, IN BOTH SOURCE CODE AND OBJECT FORM, HAS BEEN EXPLICITLY
  8. ; PLACED INTO THE PUBLIC DOMAIN BY ITS SOLE AUTHOR AND OWNER, STEVEN GIBSON,
  9. ; OF IRVINE, CA.  IT MAY THEREFORE BE FREELY REPRODUCED, EXCHANGED, UPLOADED
  10. ; AND DOWNLOADED.   HOWEVER THE AUTHOR REQUESTS THAT THIS NOTICE OF RELEASE
  11. ; AND ORIGIN OF AUTHORSHIP BE LEFT INTACT AND THAT THIS PROGRAM OR ITS DIRECT
  12. ; DERRIVATIVES, IF ANY, *NOT* BE SOLD FOR PROFIT.     ALSO, PLEASE KEEP THE
  13. ; ENTIRE SET OF FILES TOGETHER AS ONE PACKAGE.               ----> Thanks
  14. ;
  15. ;****************************************************************************
  16. ;
  17. ;  About The Program: FILES.COM              (source code file: files33.asm)
  18. ;
  19. ;  "FILES.COM" is a small resident (TSR) program which overcomes a major
  20. ;  glitch in the way IBM has implemented DOS 3.30.  Specifically, it handles
  21. ;  the requirements of explicitly ASKING DOS for additional handles and
  22. ;  keeping a block of RAM available for DOS when this request is made.
  23. ;  Any program can now have up to 256 files open when under 3.3 (counting
  24. ;  the standard pre-opened default files) if the command "FILES" is issued
  25. ;  first.  This program also has the interesting ability to spontaneously
  26. ;  remove itself ("Un-TSR") from memory after doing its job.
  27. ;
  28. ;  If you wish to suppress the message FILES delivers when it is run, simply
  29. ;  put anything after the command, (like: "files shhh") and it won't say a
  30. ;  word as it goes resident. Otherwise it makes a short (non-commercial)
  31. ;  statement of its intent as it terminates.
  32. ;
  33. ;  NOTE:  This program *ONLY* makes sense when under version 3.3 of DOS, and
  34. ;         it will refuse to run under any earlier DOS versions.  Use the
  35. ;      other DOS 3.x version of FILES.COM     (source file: files3x.asm)
  36. ;****************************************************************************
  37. ;
  38. ;             About These SOURCE CODE FILES:
  39. ;
  40. ;  This source code file, and the companion OPENER.ASM source code file, were
  41. ;  written to be instructional, clear, and a bit tutorial in nature. As such
  42. ;  they have been commented more heavily than normal self-communication
  43. ;  would normally dictate.  I hope you will find them interesting, useful,
  44. ;  and not overly verbose.  They are also examples of a general coding style
  45. ;  I've found to endure quite well.  Adopt it if you like it.
  46. ;
  47. ;  NOTE: These files were created using the incredible file editor: BRIEF
  48. ;
  49. ;****************************************************************************
  50. ;
  51. ;    To make a COM file from this ASM source code:
  52. ;
  53. ;    masm files33, files33;        <--- assemble the .asm to .obj
  54. ;    link files33;            <--- link the .obj to .exe
  55. ;    exe2bin files33 files33.com    <--- convert .exe to .com
  56. ;    del files33.obj            <--- delete the intermediate debris
  57. ;    del files33.exe
  58. ;
  59. ;****************************************************************************
  60.  
  61. ;----------------------------------------------------------------------------
  62. ;                 E Q U A T E S
  63. ;----------------------------------------------------------------------------
  64. CR            equ    0Dh        ; ASCII
  65. LF            equ    0Ah
  66. COM_TERMINATE        equ    20h        ; .COM program termination
  67.  
  68. DOS_FUNC        equ    21h        ; Interrupt to call DOS
  69.  DOS_PRINTSTRING    equ    09h        ; Dos Sub-Function Defs
  70.  DOS_SET_VECTOR        equ    25h
  71.  DOS_VERSION_NUMBER    equ    30h        ;    "    "
  72.  DOS_STAY_RESIDENT    equ    31h
  73.  DOS_GET_VECTOR        equ    35h
  74.  DOS_CREATE        equ    3Ch        ;    "    "
  75.  DOS_OPEN        equ    3DH
  76.  DOS_ALLOC        equ    48H
  77.  DOS_DEALLOC        equ    49H        ;    "    "
  78.  DOS_SETBLOCK        equ    4AH
  79.  DOS_EXEC        equ    4BH
  80.  SET_HANDLE_COUNT    equ    67h        ; <----- The *NEW* function!
  81.  
  82. NEW_HANDLE_COUNT    equ    256 + 1        ; so we cam have 256 files
  83. NEW_MAX_HANDLES        equ    256        ; assuming 256 handle params
  84. MINIMUM_VERSION        equ    3 * 256 + 30    ; version "3"."30"
  85.  
  86. ;----------------------------------------------------------------------------
  87. ;               C O D E    S E G M E N T
  88. ;----------------------------------------------------------------------------
  89. CODESEG    SEGMENT BYTE PUBLIC
  90.     ASSUME    CS:CODESEG, DS:CODESEG
  91.     ORG    02Ch            ; pointer to this program's environ
  92. Environment    LABEL WORD
  93.  
  94.     ORG    080h
  95. ParameterCount    LABEL BYTE        ; count of the command-line params
  96.  
  97.     ORG    100h            ; .com programs execute from 0100h
  98. ComStart:    jmp    TransientCode    ; jump over our resident portion
  99.  
  100. ;****************************************************************************
  101. ;               RESIDENT CODE PORTION BEGINS HERE
  102. ;****************************************************************************
  103.  
  104. OldDosInt    dd    ?        ; original int 21 vector pointer
  105. TriggerEnable    db    0        ; non-zero after enabling EXEC call
  106. HoleSegment    dw    ?        ; segment location of the "hole"
  107.  
  108. ;----------------------------------------------------------------------------
  109.  
  110. ;----------------------------------------------------------------------------
  111. ; NOTE TO THE READER:  The following "resident portion" of the TSR will make
  112. ; *MUCH* more sense if you have FIRST read the "transient portion" below. I
  113. ; suggest that you jump ahead and read that first, then come back to here....
  114. ;----------------------------------------------------------------------------
  115.     
  116. Int21Intercept:
  117. ;----------------------------------------------------------------------------
  118. ;   The transient portion of this program pointed DOS' calling Interrupt 21
  119. ;   here before terminating itself.  Therefore we receive control every time
  120. ;   anyone does an Int21h call to DOS.  (Until we've fulfilled our mission)
  121. ;----------------------------------------------------------------------------
  122.         cmp    ah, DOS_EXEC        ; is DOS starting a program?
  123.         jne    NotEnablingCall        ; nope, so skip the enabling
  124.         mov    cs:TriggerEnable, -1    ; yes!, so we simply enable
  125.         jmp    Int21Continue        ; and resume Int21 monitoring
  126.  
  127. NotEnablingCall:cmp    ah, DOS_OPEN        ; was the call an open handle?
  128.         je    SeeIfReady        ; yep, are we ready to go?
  129.         cmp    ah, DOS_CREATE        ; was it a create handle?
  130.         jne    Int21Continue        ; nope, so we keep waiting...
  131.  
  132. SeeIfReady:    cmp    cs:TriggerEnable, 0    ; have we been enabled by EXEC
  133.         je    Int21Continue        ; nope, so ignore the OPEN
  134.  
  135.         cmp    cs:HoleSegment, 0    ; did we already do our thing?
  136.         je    Int21Continue        ; yep, so don't do it again!
  137.  
  138.         push    ax            ; save the caller's calling
  139.         push    bx            ; parameters on "his" stack
  140.         push    es
  141. ;----------------------------------------------------------------------------
  142. ;  Free up the memory block, located at "HoleSegment", which was previously
  143. ;  allocated by the transient portion of this program.
  144. ;----------------------------------------------------------------------------
  145.         mov    es, cs:HoleSegment    ; get the segment number
  146.         mov    cs:HoleSegment, 0    ; zero it so we don't again
  147.         mov    ah, DOS_DEALLOC
  148.         int    DOS_FUNC        ; and release that ram block 
  149. ;----------------------------------------------------------------------------
  150. ;  Now use DOS 3.3's new function: "Set Handle Count" to get DOS to use the
  151. ;  RAM memory we've just now freed up for the purpose of allowing the handles
  152. ;----------------------------------------------------------------------------
  153.         mov    ah, SET_HANDLE_COUNT    ; ask DOS for mucho handles
  154.         mov    bx, NEW_HANDLE_COUNT    ; using the new 3.3 function
  155.         int    DOS_FUNC
  156. ;----------------------------------------------------------------------------
  157. ;     Now we verrify that interrupt 21 is still pointing at us, and if so
  158. ;     we're able to re-point it to where it was originally pointing, (thus
  159. ;     un-vectoring ourselves) then release even ourselves from ram too!
  160. ;----------------------------------------------------------------------------
  161.         mov    ah, DOS_GET_VECTOR
  162.         mov    al, DOS_FUNC        ; get int 21's address
  163.         int    DOS_FUNC
  164.         cmp    bx, OFFSET Int21Intercept
  165.         jne    RestoreStack        ; it moved, so we must remain
  166.         mov    ax, es            ;
  167.         mov    bx, cs            ; can't compare segment regs,
  168.         cmp    ax, bx            ; <sigh> so we do it this way
  169.         jne    RestoreStack
  170.  
  171.  
  172. ;---------------------------------------